/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.mindbox.mueblesalpes.presentacion.cliente;

import com.mindbox.mueblesalpes.negocio.cliente.ClienteServiceLocal;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.TipoDocumento;
import com.mindbox.mueblesalpes.negocio.entity.TipoUsuario;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.negocio.entity.Ciudad;
import com.mindbox.mueblesalpes.negocio.entity.Departamento;
import com.mindbox.mueblesalpes.negocio.entity.Pais;
import com.mindbox.mueblesalpes.negocio.exception.TiendaException;
import com.mindbox.mueblesalpes.negocio.usuario.UsuarioServiceLocal;
import com.mindbox.mueblesalpes.negocio.utilidades.IUtilidades;
import com.mindbox.mueblesalpes.negocio.utilidades.UtilidadesMock;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionInfo;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.ReglasNavegacion;
import com.mindbox.mueblesalpes.presentacion.utils.RequestParameters;
import java.util.Map;
import java.util.TreeMap;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 * Backing bean de la pantalla de creación de clientes
 * @author Diana Carolina
 */

public class ClienteBean {
    private Mensajes mensaje;
    private String tipoDocumento;
    private String numeroDocumento;
    private String nombreCompleto;
    private String telefonoResidencia;
    private String celular;
    private String direccion;
    private String ciudadResidencia;
    private String profesion;
    private String email;
    private String departamento;
    private String pais;
    private String tipoUsuario;
    private String nombreUsuario;
    private String password;
    @EJB
    private ClienteServiceLocal clienteEjb;
    @EJB
    private UsuarioServiceLocal usuarioEjb;
    @EJB
    private IUtilidades utilidades;

    /**
     * Constructor de la clase
     */
    public ClienteBean() {
        mensaje = new Mensajes();
    }
    /**
     * Método que retorna un listado de los tipos de documento
     * @return
     */
    public Map getListaTiposDocumento(){
        Map tipoDoc = new TreeMap();
        tipoDoc.put("", "Seleccionar");
        for(Object o: utilidades.consultarTipoDocumento()){
            tipoDoc.put(o.toString(), o.toString());
        }
        return tipoDoc;
    }

    /**
     * Método que carga el listado de países
     * @return Map con los nombres de países
     */
    public Map getListaPaises() {
        Map paises = new TreeMap();
        paises.put("", "Seleccionar");
        for (Pais p : utilidades.consultarPaises()) {
            paises.put(p.getPais(), p.getIdPais());
        }
        return paises;

    }
    /**
     * Método que retorna carga una lista de nombres de ciudades
     * @return Map con los nombres de ciudades
     */
    public Map getListaCiudades(){
        Map ciudades = new TreeMap();
        ciudades.put("", "Seleccionar");
        for(Ciudad c: utilidades.consultarCiudades()){
            ciudades.put(c.getNombre(), c.getIdCiudad());
        }
        return ciudades;
    }
    /**
     * Método que retorna una lista con nombres de departamentos
     * @return Map con los nombres de departamento
     */
    public Map getListaDepartamento(){
        Map departamentos = new TreeMap();
        departamentos.put("", "Seleccionar");
        for(Departamento d: utilidades.consultarDepartamentos()){
            departamentos.put(d.getNombre(), d.getIdDepartamento());
        }
        return departamentos;
    }
    /**
     * Obtiene el valor del campo tipo usuario
     * @return
     */
    public Map getTiposUsuario(){
        /**
         * Se obtiene la sesion para verificar si el llamado a esta pagina viene
         * desde el carrito de compras.
         */
        HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        String next = null;
        if(sesion != null)
            next = (String)sesion.getAttribute(RequestParameters.next_page.name());

        Map tiposUsuario = new TreeMap();
        tiposUsuario.put("", "Seleccionar");
        for(Object o: utilidades.consultarTipoUsuarios()){
            if(next != null && !o.toString().equals(TipoUsuario.ADMINISTRADOR.name()))
                tiposUsuario.put(o.toString(), o.toString());
            else if( next == null )
                tiposUsuario.put(o.toString(), o.toString());
        }
        return tiposUsuario;
    }

    /**
     * obtiene el valor del campo celular
     * @return
     */
    public String getCelular() {
        return celular;
    }
    /**
     * Asigna el valor del campo celular
     * @param celular
     */
    public void setCelular(String celular) {
        this.celular = celular;
    }
    /**
     * Obtiene el valor del campo ciudad de residencia
     * @return
     */
    public String getCiudadResidencia() {
        return ciudadResidencia;
    }
    /**
     * Asigna el valor al campo ciudad de residencia
     * @param ciudadResidencia
     */
    public void setCiudadResidencia(String ciudadResidencia) {
        this.ciudadResidencia = ciudadResidencia;
    }
    /**
     * Obtiene el valor del campo departamento
     * @return
     */
    public String getDepartamento() {
        return departamento;
    }
    /**
     * Asigna el valor al campo departamento
     * @param departamento
     */
    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }
    /**
     * Obtiene el valor del campo dirección
     * @return
     */
    public String getDireccion() {
        return direccion;
    }
    /**
     * Asigna el valor al campo dirección
     * @param direccion
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }
    /**
     * Obtiene el valor del campo email
     * @return
     */
    public String getEmail() {
        return email;
    }
    /**
     * Asigna el valor al campo email
     * @param email
     */
    public void setEmail(String email) {
        this.email = email;
    }
    /**
     * Obtiene el valor del campo nombre completo
     * @return
     */
    public String getNombreCompleto() {
        return nombreCompleto;
    }
    /**
     * Asigna el valor al campo nombre completo
     * @param nombreCompleto
     */
    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }
    /**
     * Obtiene el valor del campo número documento
     * @return
     */
    public String getNumeroDocumento() {
        return numeroDocumento;
    }
    /**
     * Asigna el valor al campo número documento
     * @param numeroDocumento: representa el número de documento
     */
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }
    /**
     * Obtiene el valor del campo país
     * @return
     */
    public String getPais() {
        return pais;
    }
    /**
     * Asigna el valor del campo país
     * @param pais
     */
    public void setPais(String pais) {
        this.pais = pais;
    }
    /**
     * Obtiene el valor del campo profesión
     * @return
     */
    public String getProfesion() {
        return profesion;
    }
    /**
     * Asigna el valor al campo profesión
     * @param profesion
     */
    public void setProfesion(String profesion) {
        this.profesion = profesion;
    }

    /**
     * Obtiene el valor del campo teléfono de residencia
     * @return
     */
    public String getTelefonoResidencia() {
        return telefonoResidencia;
    }
    /**
     * Asigna el valor del campo teléfono de residencia
     * @param telefonoResidencia
     */
    public void setTelefonoResidencia(String telefonoResidencia) {
        this.telefonoResidencia = telefonoResidencia;
    }
    /**
     * Obtiene el valor del campo tipo documento
     * @return
     */
    public String getTipoDocumento() {
        return tipoDocumento;
    }
    /**
     * Asigna el valor al campo tipo documento
     * @param tipoDocumento
     */
    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    /**
     * Obtiene el valor del campo tipo usuario
     * @return
     */
    public String getTipoUsuario() {
        return tipoUsuario;
    }
    /**
     * Asigna el valor del campo tipo usuario
     * @param tipoUsuario
     */
    public void setTipoUsuario(String tipoUsuario) {
        this.tipoUsuario = tipoUsuario;
    }
    /**
     * Obtiene el valor del campo nombre de usuario
     * @return
     */
    public String getNombreUsuario() {
        return nombreUsuario;
    }
    /**
     * Asigna el valor al campo nombre de usuario
     * @param nombreUsuario
     */
    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }
    /**
     * Obtiene el valor del campo password
     * @return
     */
    public String getPassword() {
        return password;
    }
    /**
     * Asigna el valor del campo password
     * @param password: representa la contraseña de ingreso al sistema
     */
    public void setPassword(String password) {
        this.password = password;
    }
    
    /**
     * Realiza la navegación a la página donde se ingresan los datos del usuario del sistema
     * @return
     */
    public String crear() {
       return ReglasNavegacion.crear_datos_usuario.toString();
    }
    /**
     * Captura los datos del cliente que han sido ingresados por el usuario
     * @return Cliente con los datos ingresados
     */
    public Cliente obtenerDatosCliente(){
         Cliente clienteNuevo = new Cliente();
            Ciudad ciudad = new Ciudad();
            ciudad.setIdCiudad(Long.valueOf(ciudadResidencia));
           /*Departamento deptoO = new Departamento();
        Pais paisO = new Pais();
        deptoO.setNombre(departamento);
        paisO.setPais(pais);
        deptoO.setPais(paisO);
        ciudad.setDepartamento(deptoO);*/


            if (tipoDocumento.equals(TipoDocumento.CEDULA.toString())) {
                clienteNuevo.setTipoDocumento(TipoDocumento.CEDULA);
            }
            if (tipoDocumento.equals(TipoDocumento.NIT.toString())) {
                clienteNuevo.setTipoDocumento(TipoDocumento.NIT);
            }
            clienteNuevo.setNumeroDocumento(numeroDocumento);
            clienteNuevo.setNombreCompleto(nombreCompleto);
            clienteNuevo.setTelefonoResidencia(telefonoResidencia);
            clienteNuevo.setCelular(celular);
            clienteNuevo.setDireccion(direccion);
            clienteNuevo.setProfesion(profesion);
            clienteNuevo.setCiudadResidencia(ciudad);
            clienteNuevo.setEmail(email);
           return clienteNuevo;
    }
    /**
     * Realiza la persistencia de los datos del cliente, correspondientes a los
     * datos de acceso al sistema
     * @return
     */
    public String crearUsuario() {
        try {
            Cliente clienteNuevo = this.obtenerDatosCliente();
            Usuario usuario = new Usuario();
            if (tipoUsuario.equals(TipoUsuario.ADMINISTRADOR.toString())) {
                usuario.setTipoUsuario(TipoUsuario.ADMINISTRADOR);
            } else {
                usuario.setTipoUsuario(TipoUsuario.CLIENTE);
            }
            usuario.setUsuario(nombreUsuario);
            usuario.setPwd(password);
            clienteNuevo.setUsuario(usuario);
            if(clienteEjb.crearCliente(clienteNuevo)){
                HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
                String next = null;
                if(sesion != null)
                    next = (String)sesion.getAttribute(RequestParameters.next_page.name());
                if(next != null){
                    //TODO Se debe crear el usuario y el cliente en la sesión.
                    SessionInfo sesionInfo = (SessionInfo)sesion.getAttribute(SessionInfo.class.getName());
                    if(sesionInfo == null){
                        sesionInfo = new SessionInfo();
                        sesion.setAttribute(SessionInfo.class.getName(), sesionInfo);
                    }
                    /*Cliente cliente = new Cliente();
                    cliente.setNombreCompleto("Harry");
                    cliente.setNombreCompleto("Plotter");*/
                    sesionInfo.setUsuario(usuario);
                    sesionInfo.setCliente(clienteNuevo);
                    sesion.removeAttribute(RequestParameters.next_page.name());
                    this.limpiarCamposUsuario();
                    return next;
                }else
                    
                    mensaje.asignarMensajeInfo("insert.usuario.infoCreacion");
            }else{
                mensaje.asignarMensajeError("insert.errorUsuario");
            }
            
        }catch(TiendaException e){
            mensaje.asignarMensajeError("common.error", e.getMessage());
        }
        catch (Exception e) {
            mensaje.asignarMensajeError("common.error", e.getMessage());
        }
        return ReglasNavegacion.list_clientes.toString();
    }
    /**
     * Métod relacionado a la accion del botón cancelar
     * @return
     */
    public String cancelar(){
        this.limpiarCampos();
        return ReglasNavegacion.list_clientes.toString();
    }
    /**
     * Método que limpia los campos de la pantalla de creación de Cliente
     */
    public void limpiarCampos(){
        this.setTipoDocumento("");
        this.setNumeroDocumento("");
        this.setNombreCompleto("");
        this.setTelefonoResidencia("");
        this.setCelular("");
        this.setCiudadResidencia("");
        this.setProfesion("");
        this.setEmail("");
        this.setDepartamento("");
        this.setPais("");
        this.setDireccion("");
    }
    /**
     * Método que limpia los campos de la pantalla de usuario
     */
    public void limpiarCamposUsuario(){
        this.setTipoUsuario("");
        this.setNombreUsuario("");
        this.setPassword("");
    }
}
